#include "TCP.h"

//服务端创建
struct TCP_soc serve_init(in_port_t port ,const char * ip_addr )
{
    TCP_soc soc;
    // 创建套接字  socket()
    soc.soc_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == soc.soc_fd)
    {
        perror("socket error:");
        exit(-1);
    }

    // 填充服务器网络信息结构体
    struct sockaddr_in sockaddr;    
    sockaddr.sin_family = AF_INET;  //ipv4协议
    sockaddr.sin_port = htons(port);    //端口号
    sockaddr.sin_addr.s_addr = inet_addr(ip_addr);  //ip地址
    socklen_t addrlen = sizeof(sockaddr);   //结构体长度
    // 将套接字与服务器网络信息结构体绑定
    if (-1 == bind(soc.soc_fd, (struct sockaddr *)&sockaddr, addrlen))
    {
        perror("bind error:");
        exit(-1);
    }

    // 将套接字设置成 监听状态
    if (-1 == listen(soc.soc_fd, addrlen))
    {
        perror("listen error:");
        exit(-1);
    }

    // 阻塞等待客户端连接 accept
    printf("等待连接中....\n");
    soc.acc_fd = accept(soc.soc_fd, NULL, NULL);
    if (-1 == soc.acc_fd)
    {
        perror(" accept error:");
        exit(-1);
    }
    printf("已连接成功\n");
    return soc;
}

//客户端创建
int client_init(in_port_t port ,const char * ip_addr )
{
    // 创建套接字  socket()
    int soc_1 = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == soc_1)
    {
        perror("socket error:");
        return -1;
    }

    // 填充服务器网络信息结构体
    struct sockaddr_in sockaddr;
    sockaddr.sin_family = AF_INET;
    sockaddr.sin_port = htons(port);
    sockaddr.sin_addr.s_addr = inet_addr(ip_addr);
    socklen_t addrlen = sizeof(sockaddr);

    // 连接服务器
    if (connect(soc_1, (const struct sockaddr *)&sockaddr, addrlen))
    {
        perror("connect error:");
        return -1;
    }
    return soc_1;
}

//服务器 客户端套接字关闭
void close_se_cl(TCP_soc* soc , int *soc_cli)
{
    if (soc == NULL)
    {
        close(*soc_cli);
        return ;
    }
        if (soc_cli == NULL)
    {
        close(soc->acc_fd);
        close(soc->soc_fd);
        return ;
    }
}